var fs = require('fs');

//Objet de type evenement calendar qui comporte une date de début, de fin, un résumé ainsi qu'une location.
var Event = function (dtstart, dtend, summary, location) {
 this.dtstart = dtstart;
 this.dtend = dtend;
 this.summary = summary;
 this.location = location;
}

//Cet objet représente une date .ICS avec ses différentes composantes
var DateIcs = function (annee, mois, jour, heures, minutes, secondes) {
 this.annee = annee+1900;
 this.mois = mois;
 this.jour = jour;
 this.heures = heures;
 this.minutes = minutes;
 this.secondes = secondes;
}

//Permet de retouner un évènement au format .ICS
Event.prototype.toString = function( ) {
	return "BEGIN:VEVENT\nDTSTART:"+this.dtstart+"\nDTEND:"+this.dtend+"\nSUMMARY:"+this.summary+"\nLOCATION:"+this.location+"\nEND:VEVENT\n";
}

//Permet de retourner une date au format .ICS d'un objet de la classe DateIcs
DateIcs.prototype.toString = function( ) {
	return this.annee+""+this.mois+""+this.jour+"T"+this.heures+""+this.minutes+""+this.secondes+"T";
}

//Permet d'obtenir la date du prochain lundi
function getDateStart(){
	var date = new Date();	
	
	if(date.getDay()==0){
		var dayToAdd = 1;
	}else if(date.getDay()==1){
		var dayToAdd = 7;
	}else{
		var dayToAdd = 8-date.getDay()
	}
	
	date = new Date(date.getTime()+dayToAdd*24*60*60*1000);
	
	date.setHours(0);
	date.setSeconds(0);
	date.setMinutes(0);
	date = new Date(date.getTime()-60*60*1000);
	return date;
}

//fonction qui permet de valider la concordance du fichier .csv pour la conversion au format .ics
function isValid(file, typeOfPlanning){
	fs.exists(file, function(exists) {
		if (exists) {
		   fs.readFile(file, 'utf8', function (err,data) {
					if (err) {
						return console.log(err);
					}
				
					var nbRow = 0
					var enTete = "lundi;mardi;mercredi;jeudi;vendredi;samedi;dimanche";
					var correctNbColumn = true;
					var correct1stRow = true
					
					//permet de vérifier le nb de lignes, le nombre de colonnes ainsi que l'entete du fichier .ICS
					data.split('\n').forEach(function(line) {
						if(nbRow==0 && line.trim()!=enTete){
							correct1stRow = false;
						}
						
						if(line.split(';').length!=7){
							correctNbColumn=false;
						}
						
						nbRow++;  
					});
					
					if(nbRow==49 && correctNbColumn && correct1stRow){ //on test si le fichier contient 49 lignes : l'entete + 48 lignes correspondant à 30 minutes.
						console.log("->Ce fichier est correct.\nConversion en cours.");
						csvToIcs(file, typeOfPlanning);
					}else{
						console.log("->Ce fichier est incorrect et donc inexploitable.");
					}
				});
		}
		else
			console.log("Fichier inexistant!");
	});
}
		

function csvToIcs(file, typeOfPlanning){
	fs.readFile(file, 'utf8', function (err,data) {
		var location = file.replace("."+file.split(".").pop(),"");
		if (err) {
			return console.log(err);
		}
		
		fs.writeFile(location+".ics", "", function (err) {
			if (err) {
				return console.log(err);
			}
		});
		
		var dateStart = getDateStart();
		var dateEnd = new Date(dateStart.getTime()+30*60*1000);
		data=data.split('\n');
			
		fs.appendFile(location+".ics", "BEGIN:VCALENDAR\n", function (err) {
			if (err) {
				return console.log(err);
			}
		});
					
		for(var i =1; i<data.length;i++){
			line = data[i].split(';');
			for(var j = 0; j < line.length;j++){
				var dateTempStart= new Date(dateStart.getTime()+j*24*60*60*1000); // incrémentE la date de 1 jour pour passer au jour suivant
				var dateTempEnd= new Date(dateEnd.getTime()+j*24*60*60*1000);
				
				var month = dateTempStart.getMonth()+1;
				var day = dateTempStart.getDate();
				var hours = dateTempStart.getHours();
				var minutes = dateTempStart.getMinutes();
				var seconds = dateTempStart.getSeconds();
				
				var monthEnd = dateTempEnd.getMonth()+1;
				var dayEnd = dateTempEnd.getDate();
				var hoursEnd = dateTempEnd.getHours();
				var minutesEnd = dateTempEnd.getMinutes();
				var secondsEnd = dateTempEnd.getSeconds();
				
				//Ajout d'un "0" dans le cas de valeurs < 10 pour les mois/jours/heures/minutes/secondes, pour respecter le format des dates
				if(month<10){
					month="0"+month;
				}
				if(day <10){
					day = "0"+day;
				}
				if(hours <10){
					hours = "0"+hours;
				}
				if(minutes <10){
					minutes = "0"+minutes;
				}
				if(seconds <10){
					seconds = "0"+seconds;
				}
				
				if(monthEnd<10){
					monthEnd="0"+monthEnd;
				}
				if(dayEnd <10){
					dayEnd = "0"+dayEnd;
				}
				if(hoursEnd <10){
					hoursEnd = "0"+hoursEnd;
				}
				if(minutesEnd <10){
					minutesEnd = "0"+minutesEnd;
				}
				if(secondsEnd <10){
					secondsEnd = "0"+secondsEnd;
				}
				
				var dtstart = new DateIcs(dateStart.getYear(),month, day, hours, minutes,seconds);
				var dtend = new DateIcs(dateEnd.getYear(),monthEnd, dayEnd, hoursEnd, minutesEnd,secondsEnd);
		
				if(line[j].trim()!="vide"){
					var event=""; 
					
					for(var k =0; k <line[j].split(",").length;k++){
						var summary = line[j].split(",")[k];
						
						//Si on précise que c'est un planning d'intervenant
						if(typeOfPlanning == 1){
							var locationEvent = summary.split("(")[1].replace(")", "");
						}else if(typeOfPlanning==0){ //sinon on garde le nom du fichier comme location
							var locationEvent = location;
						}
						
						var eventToAdd = new Event(dtstart.toString(), dtend.toString(),summary, locationEvent);
						event += eventToAdd.toString();
					}
					
					fs.appendFile(location+".ics", event, function (err) {
						if (err) {
							return console.log(err);
						}
					});
				}
			}
			dateStart=new Date(dateStart.getTime()+30*60*1000) //on incrémente les dates de 30 minutes pour passer à l'évènement suivant
			dateEnd=new Date(dateEnd.getTime()+30*60*1000)
		}
		fs.appendFile(location+".ics", "END:VCALENDAR", function (err) {
				if (err) {
					return console.log(err);
				}
		});
	});
	console.log("Conversion effectuée.");
}


//-------------------------------------MAIN-----------------------------------------//

var file = process.argv[2]; //on récupère le fichier passé en argument
var typeOfPlanning = process.argv[3];

if(file==null || file.split(".").pop()!="csv"){
	console.log("ERREUR : vous devez entrer un fichier .CSV à exploiter.");
}else{
	if(typeOfPlanning == null || typeOfPlanning == 0){
		console.log("Conversion du fichier "+file+" :\n");
		isValid(file, 0);
	}else if(typeOfPlanning==1){
		console.log("Conversion du fichier "+file+" :\n");
		isValid(file, 1);
	}else{
		console.log("ERREUR : type de planning spécifié incorrect.");
	}
}

//----------------------------------------------------------------------------------//